package loader
{	
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.MovieClip;
	import flash.display.Sprite;
	
	import loader.core.LoadType;
	
	import manager.LoadManager;
	
	import resource.LoadResource;

	/**
	 * 加载代理器
	 * @author cab
	 * 
	 */	
	public class LoadProxy extends Sprite
	{
		public static var id:int = 1;
		public var type:int;//类型 是加载图片还是swf
		public var url:String;//要加载的地址
		public var uid:String = "";//一个加载器加载多个资源时的标识，只能用于角色
		private var w:int,h:int;
		
		public var param:Object;//附加属性
		
		public var LOAD_STATE:uint;//加载状态
		//开始加载
		public static const LOADING:uint = 0;
		//加载完成
		public static const LOADEND:uint = 1;
		//加载取消，可能加载完了，但此时不需要执行setData，例如加载技能很慢时，到加载完成时，攻击动作已完成了，到下一轮了，此时不需要回调setData
		public static const LOADTIMOUT:uint = 2;
		
		private var _handleResult:Function;
		
		/**
		 *初始记载器 
		 * @param type 加载文件的类型
		 * @param char 加载器所属的角色
		 * 
		 */		
		public function LoadProxy(type:int)
		{
			this.type = type;
			this.uid = "uid"+id++;	//用玩家的cid标识加载器的所属,必须是唯一的
		}
		//加载
		public function load(loadUrl:String,handleResult:Function,...args):void{
			
			_handleResult = handleResult;
			
			 this.LOAD_STATE = LOADING;
		  	 this.url = loadUrl;
		  	 //默认uid为url
		  	 if(this.uid == ""){this.uid = this.url;}
			 if(type == LoadType.LOAD_ANI || type == LoadType.LOAD_MAGIC_ANI ){//加载人物动作或攻击的配置xml  //|| type == LoadType.LOAD_MAGIC
			 	if(LoadResource.loadedAction[url] != null){
					setData(LoadResource.loadedAction[url],url);
				}else{
			 		LoadManager.loadCharAction(url,this);
			 	}
			 }else{//加载swf
			 	if(LoadManager.loadedMap[url] != null){
					setData(LoadManager.loadedMap[url],url);
				}else{
					if(type ==  LoadType.LOAD_NPC_SWF ){
						//默认的npc形象
						setDefaultView("1");
					}else if( type == LoadType.LOAD_BONE_SWF  && url.indexOf("equi") == -1){
						//默认的角色和怪形象
						setDefaultView("0");
					}
			 		LoadManager.loadSwf(url,this);
			 	}
			 }
		}
		
		//加载整个npc或者整个角色的骨骼时，当图还未加载上来是用默认的盗贼图替代
		private function setDefaultView(name:String):void{
			var defaultView:Bitmap = LoadResource.getLocalImage("portrait_"+name);
			if(defaultView != null){
				defaultView.x = -defaultView.width/2;
				defaultView.y = -defaultView.height;
				//DisplayUtil.addChildAt(defaultView,this,0);
			}
		}
		
		//加载完后处理
		public function setData(data:Object,url:String = null):void
		{
			/*switch(type)
			{
				case LoadType.LOAD_BONE_SWF://骨骼
					LoadResource.initBone(data, url);
					destoryBgImg();
					Char(char).setBones(url);
					break;
				case LoadType.LOAD_ANI://动作
					var target:Char = char as Char;
					var boneImg:String  = target.charData.boneImg;
					//如果是怪物，校验一下骨骼和动作是否匹配，因为宠物和怪，在召唤召唤和面板上切换宠物时
					//网络延迟会造成骨骼和动作不匹配
					if(boneImg.indexOf("30000") == 0 && url.indexOf(boneImg) == -1){
						//DebugLayer.print(url,"骨骼和动作不匹配");
					}else{
						target.setCharAction(data.ani);
						target.charView.magicData = (data.magic);
					}
					break;
			}*/
			switch(type)
			{
				case LoadType.LOAD_BONE_SWF://骨骼,原始数据变更为所需结构数据
					LoadResource.initBone(data, url);
					if(null != _handleResult)
						_handleResult(LoadResource.getBone(url));
					break;
				case LoadType.LOAD_ANI:
				case LoadType.LOAD_MAGIC_ANI:
					if(null != _handleResult)
						_handleResult(data);
					break;
			}
			
			this.LOAD_STATE = LOADEND;
		}
		
		//添加角色身上的效果 升级 技能等
		public  function addEffect(effect:MovieClip):void{
			//DisplayUtil.addChild(this,effect);
			//DisplayUtil.setMoveclip(effect,false);
		}
		
		//效果删除
		public function removeEffect():void{
			if(this.numChildren != 0){
				//var effect:MovieClip = this.getChildAt(0) as MovieClip;
				//DisplayUtil.setMoveclip(effect,true);
				//DisplayUtil.removeAllChild(this);
			}
			//this.y = 0;
			//在调用效果清除时（ActionCast.stop()），可能效果还未加载上来，当法术动作回合已结束了，不需要回调setdata了
			this.LOAD_STATE = LOADTIMOUT;
		}
		
		
		public function destoryBgImg():void{
			this.graphics.clear();
			//DisplayUtil.removeAllChild(this);
		}
	}
}
